.data
z: .long 31
s: .long 14

out: .string "%d\n"

.text
.global main
main:

pushl z // erster parameter
pushl s // zweiter parameter
subl $4, %esp // platz fuer return
call pascal
popl %eax // ergebnis (return) nach eax
addl $8, %esp // stack wiederherstellen

// ergebnis ausgeben
pushl %eax
pushl $out
call printf
addl $8, %esp

movl $1, %eax
int $0x80



.global pascal
pascal:
// stack sichern
pushl %ebp
movl %esp, %ebp


movl 12(%ebp), %eax //s
// return 1 if s == 1
cmpl $1, %eax
je .pascal1

movl 16(%ebp), %edx //z
// return 1 if s == z
cmpl %eax, %edx
je .pascal1


//return ( p(z-1, s-1) + p(z-1, s) );
//z-1
subl $1, %edx


subl $4, %esp // spaeter result speichern
pushl %edx // z-1
pushl %eax // s
subl $4, %esp // speicher fuer 1. result
call pascal
popl %eax
movl %eax, 8(%esp) // result vor den parametern gespeichern
popl %eax // s
subl $1, %eax // s-1
pushl %eax // zweiter parameter (s-1)
subl $4, %esp // speicher fuer 2. result
call pascal
popl %eax // zweies result in eax
addl $8, %esp // parameter wegwerfen
popl %edx // result von 1 in edx

addl %edx, %eax // addition der beiden ergebnisse



// p(z-1, s) aufrufen



movl %eax, 8(%ebp)
leave
ret

// return 1
.pascal1:
movl $1, 8(%ebp)
leave
ret
